Skip to content

先款后货技术方案

订单

新增配置

pay_order_valid_seconds     # 订单支付的有效时间,单位:秒

DB改动

订单表

# order_new 
pay_status      # [新增] 支付状态 1:未支付 5:部分支付 10:已支付 15:超时关闭
settle_way      # [新增] 结款方式 1:先货后款 2:先款后货
paid_amont      # [新增] 已支付金额
refund_amount   # [新增] 已退款金额
real_pay        # 实际支付金额 = 已支付金额 - 已退款金额

freeze          # 订单锁定

create_time
datetime
modify_time

订单状态机

待支付      -->        部分支付
待支付      -->        已支付
待支付      <-->       已关闭
部分支付    <-->        已支付

接口改动

BSHOP

订单列表

接口名:order/list(前端接口,见同目录订单.md)

拉取历史未支付订单 ***

order/unpaid_list(前端接口,见同目录订单.md)

订单详情

order/detail(前端接口,见同目录订单.md)

提交订单 ***

order/submit (待确定,是否需要在下单的时候去判断还有差额)

改动点

加入账期未支付

STATION

修改订单

接口名:order/edit, order/set_status,order/update/details,order/remove/details,order/delete
改动点:增加订单锁的校验逻辑

微服接口

创建订单 【修改】***

接口名:order/create

参数改动:无

接口改动:

1,订单初始化新增字段:
settle_way:结款方式,根据下单商户设置
pay_status:支付状态,默认为1(未支付)
real_pay:实际支付,默认0
refund:退款金额,默认0
freeze:冻结,默认0
paid_amount: 已付金额,默认0
refund_amount: 已退款金额,默认0
create_time:创建时间,默认当前时间
modify_time:修改时间,默认当前时间

返回改动:无

合单 **

order/split

改动点

增加合单判定条件:统一周期内,状态为待分拣并且订单和商户为同一种结款方式(先货后款)允许合单
增加锁单的判定

更新订单商品 ***

order/detail/update

改动点

已支付先款后货不能改
更新商品后,根据订单价格变化更改订单支付状态(部分支付/已支付)

删除订单商品

order/detail/delete

改动点

已支付先款后货不能改
删除商品后,根据订单价格变化更改订单支付状态(部分支付/已支付)

set_weight

改状态,部分支付已支付

更新订单

order/update

参数:

参数名 必传M/可选O 类型 说明
order_id M str 订单号id,json格式的数组
freeze O bool 是否锁单
先做一个锁单的功能,后续可以往这个接口增加业务

周边系统

定时解锁库存脚本 ***

脚本:release_order_stock

1,读取所有超过有效期(根据配置pay_order_valid_seconds)的未支付订单
2,恢复库存
3,将订单支付状态修改为已关闭

支付

DB改动

交易流水【新增】

# tbl_trade_flow
id
trade_no
uid
trade_type          # 交易类型,订单支付、充值等  考虑下合二为一
pay_method          # 支付方式,微信、余额
status              # 交易状态 1:未支付 2:已支付
amount              # 支付金额

balance_receipt     # 余额支付凭证

wx_transaction_id   # 微信单号
wx_bank_type        # 微信到账银行
wx_fee_type         # 微信到账货币类型

支付单【新增】

# tbl_order_pay
id                  # 支付单ID,ZFD*****
trade_no            # 交易流水号
order_no            # 订单号
uid                 # 用户id
amount              # 支付金额
status              # 状态 1:未支付 2:已支付
create_time         
modify_time

退款单【新增】

# tbl_order_refund
id                  # 退款单ID,TK****
order_no            # 订单号
uid                 # 用户id
amount              # 退款金额
status              # 状态 1:未退款 2:已退款
remark              # 备注
deal_code           # 退款凭证
create_time
modify_time

冲账单 【新增】

# tbl_order_strike  
id                  # 订单冲账ID
strike_id           # 冲账id
deal_code           # 冲账凭证
order_no            # 订单号
amount              # 冲账金额
status              # 状态 1:未冲账 2:已冲账 

create_time
modify_time

微服接口

支付 ***

pay/order

参数:

参数名 必传M/可选O 类型 说明
order_ids M str 订单号id,json格式的数组

接口逻辑:

1,订单可支付的校验
2,计算应付金额:未支付订单一并计算所有部分支付订单的差额,部分支付订单仅支付本次差额
3,生成支付单,生成交易流水

返回数据:

{
  "code": 0,
  "msg": "ok"
  "data":{
    "trade_no": TRADE_NO
    "balance"
    "money"
  }
}

充值 ***

pay/charge

参数:

参数名 必传M/可选O 类型 说明
amount M int 充值金额,单位:分
group_id O str group id

返回数据:

{
  "code": 0,
  "msg": "ok"
  "data":{
    "trade_no": TRADE_NO
  }
}

发起支付***

pay

参数:

参数名 必传M/可选O 类型 说明
trade_no M str 流水号
pay_method M str wx:微信,balance:余额
openid O str 下单客户的openid,微信支付时必传
nofity_openid O str 微信通知的openid,默认为openid
client M str 支付终端 wx:公众号支付;app:app支付;driver:司机终端支付

接口逻辑

1,可支付状态校验:订单状态,金额
2,微信支付:
    1)根据订单站点,客户端类型获取支付配置
    2)根据配置请求微信支付的参数
  余额支付:
    1)发起余额支付,更新交易流水和支付单
    2)执行统一的支付处理流程,修改订单状态

返回数据:

# 微信支付返回
{
  "code": 0,
  "msg": "ok"
  "data": {
    'appId': APPID,
    'timeStamp': TIMESTAMP,
    'nonceStr': NONCE_STR,
    'package': 'prepay_id=PREPAY_ID'
    'signType': 'MD5',
    'paySign': PAY_SIGN
  }
}

# 余额支付返回
{
  "code": 0,
  "msg": "ok"
}

支付结果通知***

pay/notify

参数:

参数名 必传M/可选O 类型 说明
raw_data M str 微信通知的原始字符串

接口逻辑:

1,解析微信通知数据
2,事务内更新交易流水,支付单
3,执行统一的支付处理流程
    1)订单支付:更新订单支付状态
    2)充值:新增余额流水

签名校验放外面

订单退款 ***

order/refund

参数:

参数名 必传M/可选O 类型 说明
order_id M str 退款订单号
remark O str 备注
amount O bigint 退款金额

接口逻辑:

1,退款条件校验
2,计算退款额
3,生成退款单
更新订单
4,调用支付模块退款
5,更新退款单

订单冲账***

order/strike

参数:

参数名 必传M/可选O 类型 说明
order_ids M list 冲账订单号
strike_id M str 冲账id

接口逻辑

1,查询冲账信息,合法性校验
2,依次执行冲账:
    1)新建订单冲账单
    2)计算可冲账额度
    3)事务内更新订单,冲账单,冲账条目

周边系统

定时退款 (去掉)

脚本:auto_order_refund

1,读取已到退款时间时间配置
2,读取时间配置内real_pay大于total_price的订单
3,调用支付模块退款

接口改动

BSHOP

以下接口改为调用微服

1, pay 发起支付
2, pay/charge 充值
3, pay/wechat 微信支付
4, pay/wechat/notify 微信支付通知
5, pay/balance 余额支付
6, pay/driver 司机支付
7, pay/app app支付
8, pay/app/charge app充值

冲账

接口改动

MA

拉取冲账订单列表

finance/order/can_strike_balance

改动点

筛选支付状态为未支付或者部分支付的订单

提交冲账

strike/balance/submit

改动点

调用订单微服发起冲账

~~时间配置(去掉)~~

~~DB改动~~

~~时间配置~~

# service_time
refund_time_span        # 【新增】自动退款日
refund_time             # 【新增】自动退款时间

~~接口改动~~

~~获取/修改时间配置~~

~~station/service_time~~

~~改动点~~

POST
参数新增:
refund_time_span
refund_time

GET
返回新增
refund_time_span
refund_time

商户配置

DB

用户表

# tbl_user
settle_way              # [新增] 结款方式 1:先货后款 2:先款后货

站点

# station
default_settle_way      # [新增] 结款方式 1:先货后款 2:先款后货

接口改动

编辑商户

接口名:custommanage/edit/****(前端接口)
改动点:增加结款方式字段

站点默认结算配置

商户结算

接口改动

商户结算搜索

接口:finance/order/search(前端接口)
改动点:增加已支付金额,退款金额,支付状态字段

订单交易流水 【新增】

finance/order/trade/flow(前端接口)

返回指定订单按时间排序的支付流水,退款流水,冲账流水

返回数据

{
  "code": 0,
  "msg": "ok"
  "data": [{
    "type": "pay",      # 交易类型:支付,退款,冲账
    "amount": 111,
    "id": "",           # 支付单,退款单,冲账单号
    "operator": OPERATOR    # 操作人
    "create_time": CREATE_TIME
  }]
}

MA*

退款 【新增】

finance/order/refund

调用微服接口退款

自动锁单脚本 ***

开发计划

支付          ----------          
订单          ----      ----       部分依赖于支付,部分依赖于商户配置
冲账                    --         依赖于支付(冲账)
时间配置             ------         部分依赖于支付(退款)
商户配置      ---                  
商户结算           --    --         部分依赖于支付(退款)

测试环境

bshop:7411
station:7412
ma:7413
order微服:7414
商品库微服:7415
db: 1204